/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package riogol2;

import java.io.IOException;

/**
 *
 * @author treiman
 */
public class GameOfLife {
    
    // nouda ytimien lukumäärä
    private int threadLukumaara = Runtime.getRuntime().availableProcessors();
    
    // worker-taulukko
    private Worker[] workerLista = new Worker[threadLukumaara];
    
    // nykyinen pelitaulukko
    private Board nykyinen;
    
    // seuraava pelitaulukko
    private Board seuraava;
    
    // filehandler
    private FileHandler fileHandler;
    
    // askeleet
    private int askeleet;
        
    public Board iteroi() {
        
        // luodaan worker-oliot
        for(int i = 0; i < workerLista.length; i++) {
            // asutetaan worker-taulu
            workerLista[i] = new Worker(i, workerLista.length, nykyinen, seuraava);
        }
        
        // käynnistetään workerit
        for(Worker worker : workerLista) {
            worker.start();
        }
        
        // odotetaan valmistumista
        for(Worker worker : workerLista) {
            try {
                worker.join();
            }
            catch(InterruptedException ie) {
                ie.printStackTrace();
            } 
        }
        
        // vaihdetaan uusi ja vanha taulukko keskenään
        Board temp = nykyinen;
        nykyinen = seuraava;
        seuraava = temp;
        
        // palautetaan tuore taulukko
        return nykyinen;
    }
    
    public void tulostaSolut(int[][] taulu) {
        System.out.print("Tulostetaan Solut: ");
        for (int i = 0; i < taulu.length; i++) {
            System.out.println("");
            for (int j = 0; j < taulu[0].length - 1; j++) {
                System.out.print(taulu[i][j] + " ");
            }
            System.out.print(taulu[i][taulu.length - 1]);
        }
        System.out.println("");
    }

    public int getAskeleet() {
        return askeleet;
    }

    public void setAskeleet(int askeleet) {
        this.askeleet = askeleet;
    }

    public Board getNykyinen() {
        return nykyinen;
    }

    public void setNykyinen(Board nykyinen) {
        this.nykyinen = nykyinen;
    }

    public Board getSeuraava() {
        return seuraava;
    }

    public void setSeuraava(Board seuraava) {
        this.seuraava = seuraava;
    }
    
    public void alustaPeli(String tiedosto) throws IOException {

        int koko;
        
        // alustetaan uusi filehandler
        fileHandler = new FileHandler();
        
        // luetaan tiedosto
        fileHandler.readFile(tiedosto);
        
        // luetaan koko
        koko = fileHandler.getKoko();
        
        // luetaan askeleet
        askeleet = fileHandler.getAskeleet();

        // alustetaan kaksi board-oliota
        nykyinen = new Board(koko, koko);
        seuraava = new Board(koko, koko);
        
        int[][] t = fileHandler.getSoluMatriisi();
        nykyinen.setTaulu(t);
        
    }
    
    public static void main(String[] args) {
        GameOfLife gol = new GameOfLife();
        
        try {
            gol.alustaPeli("life_800_10000.txt");
            for(int i = 0; i < gol.getAskeleet(); i++) {
                gol.setNykyinen(gol.iteroi());
            }
            
            
            
        }
        catch(IOException ioe) {
            ioe.printStackTrace();
        }

    }
}
